home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / APPLICAT / C034.ZIP / DBQSEL.C < prev    next >
Text File  |  2010-11-01  |  8KB  |  398 lines

  1. /* SDB - select data from database */
  2.  
  3. #include "bdscio.h"
  4. #include "dbqdefs.h"
  5.  
  6. struct sel *db_select(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9)
  7.     char *fmt;
  8.  
  9. {
  10.     struct sel *slptr;
  11.     char rname[KEYWORDMAX+1];    /* save first att - maybe rel */
  12.     int sav_err;            /* save error code */
  13. #ifdef DBPI
  14.     if (fmt != NULL)
  15.         db_scan(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9);
  16. #endif
  17.     if ((slptr = CALLOC(SELSIZE)) == NULL)
  18.         { RETERR(INSMEM) }
  19.  
  20.     slptr->sl_rels = NULL;
  21.     slptr->sl_attrs = NULL;
  22.     slptr->sl_where = NULL;
  23.     slptr->sl_bindings = NULL;
  24.  
  25.     if (!get_sattrs(slptr)) {
  26.         db_done(slptr);
  27.         return (NULL);
  28.     }
  29.  
  30.     if (db_token() == FROM) {
  31.         db_ntoken();
  32.         if (!get_srels(slptr)) {
  33.             db_done(slptr);
  34.             return (NULL);
  35.         }
  36.     }
  37.     else {
  38. /*        if (!srelation(slptr,"current",NULL)) {
  39.             db_done(slptr);
  40.             return (NULL);
  41.         }
  42. */
  43.         srelation(slptr,"current",NULL);
  44.     }
  45.  
  46.     if (!check_attrs(slptr)) {
  47.         sav_err = dbv_errcode;
  48.         strcpy(rname,slptr->sl_attrs->sa_aname); /* maybe rname */
  49.         db_done(slptr);
  50.         if ((slptr = CALLOC(SELSIZE)) == NULL)
  51.             { RETERR(INSMEM) }
  52.  
  53.         slptr->sl_rels = NULL;
  54.         slptr->sl_attrs = NULL;
  55.         slptr->sl_where = NULL;
  56.         slptr->sl_bindings = NULL;
  57.         if (!srelation(slptr,rname,NULL)) {
  58.             db_done(slptr);
  59.             dbv_errcode = sav_err;
  60.             return(NULL);
  61.         }
  62.  
  63.         if (!check_attrs(slptr)) {
  64.             db_done(slptr);
  65.             return (NULL);
  66.         }
  67.     }
  68.  
  69.     if (db_token() == WHERE) {
  70.         db_ntoken();
  71.         if (!db_compile(slptr)) {
  72.             db_done(slptr);
  73.             return (FALSE);
  74.         }
  75.     }
  76.  
  77.     return (slptr);
  78. }
  79.  
  80. struct sel *db_retrieve(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9)
  81.     char *fmt;
  82.  
  83. {
  84.     struct sel *slptr;
  85. #ifdef DBPI
  86.     if (fmt != NULL)
  87.         db_scan(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9);
  88. #endif
  89.     if ((slptr = CALLOC(SELSIZE)) == NULL)
  90.         { RETERR(INSMEM) }
  91.  
  92.     
  93.     slptr->sl_rels = NULL;
  94.     slptr->sl_attrs = NULL;
  95.     slptr->sl_where = NULL;
  96.     slptr->sl_bindings = NULL;
  97.  
  98.     if (db_token() == ID) {
  99.         if (!get_srels(slptr)) {
  100.             db_done(slptr);
  101.             return (NULL);
  102.         }
  103.     }
  104.     else {
  105.         if (!srelation(slptr,"current",NULL)) {
  106.             db_done(slptr);
  107.             return (NULL);
  108.         }
  109.     }
  110.  
  111.     if (!check_attrs(slptr)) {
  112.         db_done(slptr);
  113.         return (NULL);
  114.     }
  115.  
  116.     if (db_token() == WHERE) {
  117.         db_ntoken();
  118.         if (!db_compile(slptr)) {
  119.             db_done(slptr);
  120.             return (FALSE);
  121.         }
  122.     }
  123.  
  124.     return (slptr);
  125. }
  126.  
  127. db_done(slptr)
  128.     struct sel *slptr;
  129. {
  130.     struct sattr *saptr,*nxtsa;
  131.     struct srel *srptr,*nxtsr;
  132. #ifdef DBPI
  133.     struct binding *bdptr,*nxtbd;
  134. #endif
  135.  
  136.     for (saptr = slptr->sl_attrs; saptr != NULL; saptr = nxtsa) {
  137.         nxtsa = saptr->sa_next;
  138.         if (saptr->sa_rname != NULL)
  139.             CFREE(saptr->sa_rname);
  140.         CFREE(saptr->sa_aname);
  141.         if (saptr->sa_name != NULL)
  142.             CFREE(saptr->sa_name);
  143.         if (saptr->sa_total != NULL)
  144.             CFREE(saptr->sa_total);
  145.         CFREE(saptr);
  146.     }
  147.  
  148.     for (srptr = slptr->sl_rels; srptr != NULL; srptr = nxtsr) {
  149.         nxtsr = srptr->sr_next;
  150.         if (srptr->sr_name != NULL)
  151.             CFREE(srptr->sr_name);
  152.         db_rclose(srptr->sr_scan);
  153.         CFREE(srptr);
  154.     }
  155.  
  156.     db_fcode(slptr);
  157.     dbv_total = FALSE;
  158. #ifdef DBPI
  159.     for (bdptr = slptr->sl_bindings; bdptr != NULL; bdptr = nxtbd) {
  160.         nxtbd = bdptr->bd_next;
  161.         CFREE(bdptr);
  162.     }
  163. #endif
  164.     CFREE(slptr);
  165. }
  166.  
  167. int db_fetch(slptr)
  168.     struct sel *slptr;
  169. {
  170.     struct srel *srptr;
  171.     struct binding *bdptr;
  172.  
  173.     for (srptr = slptr->sl_rels; srptr != NULL; srptr = srptr->sr_next)
  174.         srptr->sr_update = FALSE;
  175.  
  176.     while (process(slptr->sl_rels))
  177.       if (db_interpret(slptr)) {
  178. #ifdef DBPI
  179.     for (bdptr = slptr->sl_bindings; bdptr != NULL; bdptr = bdptr->bd_next)
  180.         db_aget(bdptr->bd_attr,bdptr->bd_vtuple,bdptr->bd_vuser);
  181. #endif
  182.         return (TRUE);
  183.       }
  184.     return (FALSE);
  185. }
  186.  
  187. int db_update(slptr)
  188.     struct sel *slptr;
  189. {
  190.     struct srel *srptr;
  191.  
  192.     for (srptr = slptr->sl_rels; srptr != NULL; srptr = srptr->sr_next)
  193.         if (srptr->sr_update)
  194.             if (!db_rupdate(srptr->sr_scan))
  195.                 return (FALSE);
  196.     return (TRUE);
  197. }
  198.  
  199. int db_store(slptr)
  200.     struct sel *slptr;
  201. {
  202.     struct srel *srptr;
  203.  
  204.     for (srptr = slptr->sl_rels; srptr != NULL; srptr = srptr->sr_next)
  205.         if (srptr->sr_update)
  206.             if (!db_rstore(srptr->sr_scan))
  207.                 return (FALSE);
  208.     return (TRUE);
  209. }
  210. #ifdef DBPI
  211. int db_bind(slptr,rname,aname,avalue)
  212.     struct sel *slptr; char *rname,*aname,*avalue;
  213. {
  214.     struct binding *newbd;
  215.     struct srel *srptr;
  216.  
  217.     if ((newbd = CALLOC(BINDSIZE)) == NULL)
  218.         { RETERR(INSMEM) }
  219.     newbd->bd_vuser = avalue;
  220.  
  221.     if (!find_attr(slptr,rname,aname,&newbd->bd_vtuple,&srptr,&newbd->bd_attr))
  222.         return (FALSE);
  223.  
  224.     newbd->bd_next = slptr->sl_bindings;
  225.     slptr->sl_bindings = newbd;
  226.  
  227.     return (TRUE);
  228. }
  229. #endif
  230.  
  231. int db_get(slptr,rname,aname,avalue)
  232.     struct sel *slptr; char *rname,*aname,*avalue;
  233. {
  234.     struct srel *srptr;
  235.     struct attribute *aptr;
  236.     char *vptr;
  237.  
  238.     if (!find_attr(slptr,rname,aname,&vptr,&srptr,&aptr))
  239.         return (FALSE);
  240.  
  241.     db_aget(aptr,vptr,avalue);
  242.  
  243.     return (TRUE);
  244. }
  245.  
  246.  
  247. int db_put(slptr,rname,aname,avalue)
  248.     struct sel *slptr; char *rname,*aname,*avalue;
  249. {
  250.     struct srel *srptr;
  251.     struct attribute *aptr;
  252.     char *vptr;
  253.  
  254.     if (!find_attr(slptr,rname,aname,&vptr,&srptr,&aptr))
  255.         return (FALSE);
  256.  
  257.     db_aput(aptr,vptr,avalue);
  258.  
  259.     srptr->sr_update = TRUE;
  260.  
  261.     return (TRUE);
  262. }
  263.  
  264.  
  265. int db_sattr(slptr,rname,aname,ptype,pptr,plen)
  266.     struct sel *slptr; char *rname,*aname;
  267.     int *ptype; char **pptr; int *plen;
  268. {
  269.     struct srel *srptr;
  270.     struct attribute *aptr;
  271.  
  272.     if (!find_attr(slptr,rname,aname,pptr,&srptr,&aptr))
  273.         return (FALSE);
  274.  
  275.     *ptype = aptr->at_type;
  276.     *plen = aptr->at_size;
  277.  
  278.     return (TRUE);
  279. }
  280.  
  281. get_sattrs(slptr)
  282.     struct sel *slptr;
  283. {
  284.     struct sattr *newsattr,*lastsattr;
  285.  
  286.     if (db_token() == '*') {
  287.         db_ntoken();
  288.         if (db_token() == PLUS) {
  289.             db_ntoken();
  290.             dbv_total = TRUE;
  291.         }
  292.         return (TRUE);
  293.     }
  294.     else if (db_token() != ID)
  295.         return (TRUE);
  296.  
  297.     lastsattr = NULL;
  298.     while (TRUE) {
  299.  
  300.         if (db_ntoken() != ID)
  301.             { RETERR(SYNTAX) }
  302.  
  303.         if ((newsattr = CALLOC(SATSIZE)) == NULL)
  304.             { RETERR(INSMEM) }
  305.  
  306.         newsattr->sa_next = NULL;
  307.  
  308.         if ((newsattr->sa_aname =
  309.             CALLOC(strlen(dbv_tstring)+1)) == NULL) {
  310.             CFREE(newsattr);
  311.             RETERR(INSMEM)
  312.         }
  313.         strcpy(newsattr->sa_aname,dbv_tstring);
  314.  
  315.         if (db_token() == '.') {
  316.             db_ntoken();
  317.  
  318.             newsattr->sa_rname = newsattr->sa_aname;
  319.  
  320.             if (db_ntoken() != ID) {
  321.                 CFREE(newsattr->sa_aname); CFREE(newsattr);
  322.                 RETERR(SYNTAX)
  323.             }
  324.  
  325.             if ((newsattr->sa_aname =
  326.                 CALLOC(strlen(dbv_tstring)+1)) == NULL) {
  327.                 CFREE(newsattr->sa_aname); CFREE(newsattr);
  328.                 RETERR(INSMEM)
  329.             }
  330.  
  331.             strcpy(newsattr->sa_aname,dbv_tstring);
  332.         }
  333.         else
  334.             newsattr->sa_rname = NULL;
  335.  
  336.         if (db_token() == PLUS) {
  337.             db_ntoken();
  338.             if ((newsattr->sa_total = CALLOC(4)) == NULL) {
  339.                 if (newsattr->sa_rname != NULL)
  340.                     CFREE(newsattr->sa_rname);
  341.                 CFREE(newsattr->sa_aname); CFREE(newsattr);
  342.                 RETERR(INSMEM)
  343.             }    
  344.             setmem(newsattr->sa_total,4,NULL);
  345.         } else
  346.             newsattr->sa_total = NULL;
  347.     
  348.  
  349.         if (db_token() == ID) {
  350.             db_ntoken();
  351.  
  352.             if ((newsattr->sa_name =
  353.                 CALLOC(strlen(dbv_tstring)+1)) == NULL) {
  354.                 if (newsattr->sa_rname != NULL)
  355.                     CFREE(newsattr->sa_rname);
  356.                 if (newsattr->sa_total != NULL)
  357.                     CFREE(newsattr->sa_total);
  358.                 CFREE(newsattr->sa_aname); CFREE(newsattr);
  359.                 RETERR(INSMEM)
  360.             }
  361.             strcpy(newsattr->sa_name,dbv_tstring);
  362.         }
  363.         else
  364.             newsattr->sa_name = NULL;
  365.  
  366.         if (lastsattr == NULL)
  367.             slptr->sl_attrs = newsattr;
  368.         else
  369.             lastsattr->sa_next = newsattr;
  370.         lastsattr = newsattr;
  371.  
  372.         if (db_token() != ',')
  373.             break;
  374.         db_ntoken();
  375.     }
  376.  
  377.     return (TRUE);
  378. }
  379.  
  380. /* from dbqmth */
  381.  
  382. int db_cmp(arg1,arg2)
  383.     char *arg1,*arg2;
  384. {
  385.     char farg1[4],farg2[4];
  386.  
  387.     atols(farg1,arg1,4);
  388.     atols(farg2,arg2,4);
  389.     return (lcomp(farg1,farg2));
  390. }
  391.  
  392. *arg1,*arg2;
  393. {
  394.     char farg1[4],farg2[4];
  395.  
  396.     atols(farg1,arg1,4);
  397.     atols(farg2,arg2,4);
  398.     re